import axios from "axios";
import { message } from "antd";
import { getToken, setToken } from ".";
import { refreshToken } from "@/api/login";

const request = axios.create({
  baseURL: import.meta.env.VITE_API_BASEURL,
  timeout: 3 * 1000,
});

// 请求拦截器
request.interceptors.request.use((config) => {
  // 获取 token
  const token = getToken();
  // 携带 token 到请求头中的 Authorization 字段上
  if (token) {
    config.headers.Authorization = token;
  }
  return config;
});

// 响应拦截器
request.interceptors.response.use(
  // 2xx
  (response) => {
    // 判断业务状态码是否成功
    const { code, message: msg } = response.data;

    switch (code) {
      case 1000:
        // 成功，返回接口返回值中的data字段的内容
        return response.data.data;

      case 1001:
        message.error(msg);
        return Promise.reject(message);

      case 1002:
        message.error(msg);
        return Promise.reject(message);

      default:
        message.error(msg);
        return Promise.reject(message);
    }
  },
  // 非2xx
  async (error) => {
    // 获取 HTTP 状态码
    const status = error.response?.status;

    console.log("error.config", error.config);
    // 避免 refreshToken 401 也走进来
    if (
      status === 401 &&
      error.config.url !== "/admin/base/open/refreshToken"
    ) {
      // TOKEN 过期了

      // 调用刷新TOKEN的接口
      try {
        const resp = await refreshToken();
        // 将 token 写入本地存储
        setToken(resp.token);

        // 请求重新发送
        const newResp = await request(error.config);

        return newResp;
      } catch (error) {
        console.log("error", error);
        localStorage.clear();
        location.reload();
        return Promise.reject(error);
      }
    }

    return Promise.reject(error);
  }
);

export default request;
